/* 
 * File:   in_out.c
 * Author: Vagner Clementino
 *
 * Created on 10 de Março de 2012, 21:39
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "in_out.h"

void valida_sintaxe(int argc, char** argv, char* arquivo_entrada, 
                    char* arquivo_saida){
    if(argc == 5){
        /* Sintase correta.*/
        if( (sscanf(argv[2],"%s",arquivo_entrada)) != 1){
            /*Não foi possível reconher nome do arquivo de entrada.*/
            printf("Erro ao validar nome do arquivo de entrada!\n");
            exit(-1);
        }
        
        if( (sscanf(argv[4],"%s",arquivo_saida)) != 1){
            /*Não foi possível reconher nome do arquivo de entrada.*/
            printf("Erro ao validar nome do arquivo de saida!\n");
            exit(-1);
        }
    }else{
        /*Numero de argumentos invalidos*/
        printf("Erro na sintaxe de execução do programa."
                "Verifique se o valor informado corresponde a sintaxe "
                "tp0 -i 'arquivo_entrada.txt' -o 'arquivo_saida.txt\n");
        exit(-2);
    }
}

FILE* abre_arquivo(const char* nome_arquivo, const char* modo){
    FILE* arquivo;
    arquivo = fopen(nome_arquivo, modo);
    if (arquivo == NULL){
        /*Erro ao abrir o arquivo*/
        printf("Erro ao abrir o arquivo %s.", nome_arquivo);
        exit(-3);
    }else{
        return arquivo;
    }
}

void fecha_arquivo(FILE* arquivo_aberto){
    int status_fechamento;
    if( (status_fechamento = fclose (arquivo_aberto)) != 0){
        printf("Erro ao fechar o arquivo especificado!\n");
        exit(-4);
    }
}

char* le_linha(FILE *input) {
    
    ssize_t bytes_lidos;
    size_t tam_linha = 0;
    int tam_str_lida; /*Tamanho da string lida dinamicamente*/
    char *linha = NULL;
    
        
    bytes_lidos = getline(&linha, &tam_linha, input);
    
    if (bytes_lidos == -1) {
        /*Erro ou EOF*/
        return NULL;
    } else {
        tam_str_lida = strlen(linha);
        /*Se o ultimo carectere da string
             * for uma 'nova linha' trocar pelo
             * caractere '\0' que indica o final de uma
             * string.
             */
        if(linha[tam_str_lida-1] == '\n'){
            
            linha[tam_str_lida-1] = '\0';
        }
        return linha;
    }
}

void copia_para_vetor(const char* str, int* vetor, int tam_vetor, 
                       int* tam_lista_pref){
    
    char* ch_separador; /*Caractere que separa os numeros que no
                         * nosso caso e o ' ' (espaco)*/
    int local_em_str; /*Indice do caractere procurado(espaco)
                       * na string.*/
    int i = -1; /*iterador*/
    
    ch_separador = strchr(str,' '); /*Buscando a primeira ocorrencia de ' '*/
    
    while(ch_separador != NULL && i < tam_vetor){
        
        local_em_str = (ch_separador-str); /*Definindo a posicao exata na
                                            * string*/
        i++;
        
        vetor[i] = atoi(&str[local_em_str-1]);
        ch_separador = strchr(ch_separador+1,' ');
    }
    i++;
    vetor[i] = atoi(&str[i+2]);
    *(tam_lista_pref) = i;
}

void copia_para_vetor2(char* str, int* vetor, int tam_vetor, 
                       int* tam_lista_pref){
    
    
    int index_vetor = 0;
    char delim[] = " ";
    char* token = NULL;
    
    token = strtok(str, delim);
    
    while( token != NULL){
        vetor[index_vetor] = atoi(token);
        index_vetor++;
        token = strtok(NULL,delim);        
    }
    *tam_lista_pref = (index_vetor-1);
}

void string_para_vetorint(char* vchar, int** vint, int* tam_vint){
    
    int tam_char = strlen(vchar);
    *(tam_vint) = tam_char/2;
    int i = 0;
    
    *vint = (int*) malloc(*(tam_vint) * sizeof(int));
    if(vint == NULL){
        exit(-1);
    }
    
    char delim[] = " ";
    char* token = NULL;
    
    token = strtok(vchar, delim);
    
    while( token != NULL){
        (*vint)[i] = (int)atoi(token);
        i++;
        token = strtok(NULL,delim);        
    }
    
}

void copia_vetores(const int* origem, int** destino, int inicio, int fim){
    int i;
    for(i = inicio;i<fim;i++){
        (*destino)[i-1] = origem[i];      
    }
    
}